package com.guyaogg.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 * 1.引入 AMQP 场景（Rabbit）  RabbitAutoConfiguration
 * 2.给容器中自动注入了   AmqpAdmin  RabbitTemplate  RabbitConnectionFactoryBean  RabbitMessagingTemplate
 * 3.配置
 *      #@ConfigurationProperties(prefix = "spring.rabbitmq")
 *      public class RabbitProperties
 * 4.@EnableRabbit:开启 rabbit 注解
 * 5.监听消息：使用 @RabbitListener： 标在 类 + 方法 ；必须 开启 rabbit 注解，监听那条队列
 * #               @RabbitHandler： 标在 方法 ； 可以重载区分不同消息
 * 6.本地同类方法事务失效解决
 *      引入 aop
 *      开启 aop  以后动态代理就使用 spring 的 AspectJ 动态代理，(可以没有接口也能创建动态代理
 *      设置 exposeProxy = true，对外暴露代理对象
 *      然后本类对象方法使用，暴露代理对象调用
 * 7.Seata 控制分布式事务
 *      每个数据库创建 undo_log 表
 *      安装事务协调器 https://github.com/seata/seata/tags
 *      整合
 *          依赖 a spring-cloud-starter-alibaba-seata g com.alibaba.cloud  io.seata:seata-all:1.3.0
 *          启动 seata-server
 *              registry.conf :配置中心配置
 *          所有想要用到分布式事务的微服务使用 seata DataSourceProxy 代理自己的数据源
 *          每个微服务都必须导入 file.config 和  registry.conf
 *            vgroupMapping.gulimall-order-fescar-service-group = "default"
 *             #only support when registry.type=file, please don't set multiple addresses
 *              default.grouplist = "192.168.10.200:8091" 1.3要做 yaml 配置文件中添加该配置
 *          给分布式事务入口标注 @GlobalTransactional
 *              其他分布式保持 @Transactional 就可以了
 * @author 顾遥
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableFeignClients
@EnableRedisHttpSession
@EnableRabbit
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
